java中List元素移除元素的那些坑(上)

您所在的位置:网站首页 list 移除元素 java中List元素移除元素的那些坑(上)

java中List元素移除元素的那些坑(上)

2022-06-03 23:19| 来源: 网络整理| 查看: 265

一、问题案例

 1.1、for循环移除

public static void main(String[] args) { List list = new ArrayList(); list.add("11"); list.add("11"); list.add("12"); list.add("13"); list.add("14"); list.add("15"); list.add("16"); System.out.println("原始list元素:"+ list.toString()); CopyOnWriteArrayList copyList = new CopyOnWriteArrayList(list); //通过下表移除等于11的元素 for (int i = 0; i < list.size(); i++) { String item = list.get(i); if("11".equals(item)) { list.remove(i); } } System.out.println("通过下表移除后的list元素:"+ list.toString()); //通过对象移除等于11的元素 for (int i = 0; i < copyList.size(); i++) { String item = copyList.get(i); if("11".equals(item)) { copyList.remove(item); } } System.out.println("通过对象移除后的list元素:"+ list.toString()); }

输出结果:

原始list元素:[11, 11, 12, 13, 14, 15, 16] 通过下表移除后的list元素:[11, 12, 13, 14, 15, 16] 通过对象移除后的list元素:[11, 12, 13, 14, 15, 16]

有没有发现有蹊跷的地方?

从输出结果可以看的出,移除后的元素,并没有把内容为 11 的都移除掉!

发生了什么?

删除了第一个 11 后,集合里的元素个数减1,后面的元素往前移了1位,此时,第二个 11 已经移到了索引 index=1的位置,而此时i马上i++了,list.get(i)获得的是数据  12 。同时 list.size() 的值也在减小。所以最后输出那个结果。

public static void main(String[] args) { List list = new ArrayList(); list.add("11"); list.add("11"); list.add("12"); list.add("13"); list.add("14"); list.add("15"); list.add("16"); System.out.println("原始list元素:"+ list.toString()); //通过对象移除等于11的元素 for (String item : list) { if("11".equals(item)) { list.remove(item); } } System.out.println("通过对象移除后的list元素:"+ list.toString()); }

输出结果:

85.jpg

抛ConcurrentModificationException异常!

foreach 写法实际上是对的 Iterable 、hasNext 、next 方法的简写。因此我们从List.iterator() 着手分析,跟踪  iterator() 方法,该方法返回了 Itr 迭代器对象。

找到  List  的迭代器类

public Iterator iterator() { return new Itr(); }

Itr 对象

private class Itr implements Iterator { int cursor; // index of next element to return int lastRet = -1; // index of last element returned; -1 if no such int expectedModCount = modCount; Itr() {} public boolean hasNext() { return cursor != size; } @SuppressWarnings("unchecked") public E next() { checkForComodification(); int i = cursor; if (i >= size) throw new NoSuchElementException(); Object[] elementData = ArrayList.this.elementData; if (i >= elementData.length) throw new ConcurrentModificationException(); cursor = i + 1; return (E) elementData[lastRet = i]; } public void remove() { if (lastRet < 0) throw new IllegalStateException(); checkForComodification(); try { ArrayList.this.remove(lastRet); cursor = lastRet; lastRet = -1; expectedModCount = modCount; } catch (IndexOutOfBoundsException ex) { throw new ConcurrentModificationException(); } } @Override @SuppressWarnings("unchecked") public void forEachRemaining(Consumer


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3